package com.wg.msshopsp.backendmanagement.shop.service;

import com.wg.msshopsp.backendmanagement.shop.entity.Product;
import com.wg.msshopsp.backendmanagement.shop.entity.ProductSpec;
import com.wg.msshopsp.backendmanagement.shop.entity.ProductSpecValue;
import com.wg.msshopsp.backendmanagement.shop.mapper.ProductMapper;
import com.wg.msshopsp.backendmanagement.shop.mapper.ProductSpecMapper;
import com.wg.msshopsp.backendmanagement.shop.mapper.ProductSpecValueMapper;
import com.wg.msshopsp.backendmanagement.shop.mapper.ShopPMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service // 标记这是一个服务类，由Spring管理
public class ProductService {
    // 注入前面写的4个Mapper（自动获取实例，不用手动new）
    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private ProductSpecMapper specMapper;
    @Autowired
    private ProductSpecValueMapper specValueMapper;
    @Autowired
    private ShopPMapper shopPMapper;

    // 商品上架的核心方法
    // @Transactional：保证以下所有操作在一个事务中，出错则全回滚
    @Transactional(rollbackFor = Exception.class)
    public void uploadProduct(Product product) {
        // 插入商品基本信息
        product.setStatus("0");
        productMapper.insert(product);
        // 插入后，product的id字段已被MyBatis自动赋值（因为@SelectKey）
        Long productId = product.getId();
        System.out.println("插入商品成功，ID：" + productId);

        // 循环插入每个规格名（比如“颜色”“尺码”）
        for (ProductSpec spec : product.getSpecs()) {
            // 给规格名设置关联的商品ID（必须，否则规格不知道属于哪个商品）
            spec.setProductId((long) Math.toIntExact(productId));
            // 插入规格名
            specMapper.insert(spec);
            // 插入后，spec的id字段已被赋值
            Integer specId = Math.toIntExact(spec.getId());
            System.out.println("插入规格名成功，ID：" + specId);

            // 循环插入当前规格的所有值（比如“红色”“蓝色”）
            for (ProductSpecValue value : spec.getValues()) {
                // 给规格值设置关联的规格ID
                value.setSpecId(Long.valueOf(specId));
                // 插入规格值
                specValueMapper.insert(value);
                System.out.println("插入规格值成功：" + value.getValue());
            }
        }

        // 更新店铺的商品数量（+1）
        shopPMapper.incrementProductCount(product.getShopId());
        System.out.println("店铺商品数更新成功");
    }


    // 新增商品更新方法
    @Transactional(rollbackFor = Exception.class)
    public void updateProduct(Product product) {
        // 1. 校验商品ID是否存在
        Product existingProduct = productMapper.selectById(product.getId());
        if (existingProduct == null) {
            throw new IllegalArgumentException("商品不存在，ID：" + product.getId());
        }

        // 2. 更新商品基本信息（名称、价格、库存等）
        productMapper.update(product);

        // 3. 先删除原有规格及规格值（全量替换策略，适合大部分场景）
        specMapper.deleteByProductId(product.getId());

        // 4. 插入新的规格及规格值
        for (ProductSpec spec : product.getSpecs()) {
            spec.setProductId(product.getId()); // 绑定商品ID
            specMapper.insert(spec); // 插入规格

            for (ProductSpecValue value : spec.getValues()) {
                value.setSpecId(spec.getId()); // 绑定规格ID
                specValueMapper.insert(value); // 插入规格值
            }
        }
    }

}